#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__author__ = "Administrator"
__name__="decorator_learn"
__date__="2016/9/21"
__time__="16:46"
"""

# 无参数的装饰器
def deco(func):
    def wrapper():
        print 'befor'
        func()
        print 'after'
    return wrapper

@deco
def myfunc():
    print 'hello world'
'''
@deco  等同于： myfunc = deco(myfunc)  ;但这种写法太过麻烦，于是python提供了一种更优雅的写法，被称为语法糖
deco() 返回的是wrapper函数对象 = wrapper
函数对象myfunc当作参数传递给deco()函数，即，func =myfunc
func() = myfunc() = deco()() = wrapper()    ，​即调用wrapper()这个函数
wrapper()这个函数就是核心处理函数。
@deco 只是写法上的优化，解释器仍然会将它转化为： myfunc=deco(myfunc)来执行。
'''
myfunc()
print '===='
myfunc()

print '#############################'
# 对带参数的函数进行装饰

def outer(func):
    def wrapper1(arg):
        print 'before 1 -----',arg
        func(arg)
        print 'after 1 -----',arg
    return wrapper1

@outer
def func1(arg):
    print 'func1:',arg



func1('tomcat')
func1('naginx')

print '######################'
# 对参数数量不确定的函数进行装饰
# 参数用（*args, **kwargs）自动使用变参和命名参数
# 函数对象有一个__name__属性，可以取到函数的名字。

def deco1(func):
    def _deco1(*args,**kwargs):
        print 'before ---',args[1]
        func(*args,**kwargs)
        print 'after ---',kwargs
    return _deco1

@deco1
def f1(a,b):
    print 'f1 = a + b '
@deco1
def f2(a,b,c):
    print 'f2 = a + b + c '


f1(1,2)
f2('1',['a',2,[1,2]],{'c':4})

print '++++++++++++++++++++++++'



